#########################################################
## WD já setado via abertura do projeto
setwd("~/R/tese")
## zera todos os objetos
#rm(list = ls()) 

#######################################################
# instalação de pacotes QCA - feita em 05out2022
# do script do Patrick Mello
#install.packages("QCA")
#install.packages("SetMethods")
#install.packages("readxl")
library("QCA")
library("SetMethods")
# do script do Adrian na disciplina
library(dplyr) # data transformation
library(tibble) # column to rownames
library(devtools) # session info and parameters
library(formattable) # nicer truth tables
# para ler arquivos xls
library(readxl)
#######################################################3

#  soluções de emergência
# se rodar em outro ambiente: usar comando setwd
#  se der pau na leitura direta do xls, converter arquivos de 
#  entrada excel em csv e usar no estilo:
#                  modelo = read.csv("Polity V.csv", header = TRUE, sep = ";")


#################################################################
########################### funções pré-programadas
#################################################################


#  converte do nome do pais para o codigo de 2 digitos da internet
converte.nomeingles.codigo <- function(nomeingles)
  {
  codigo = NA
  if (( nomeingles ==     "Argentina" ) | ( nomeingles ==  "ARGENTINA" ))
    { codigo = "AR"}
  if (( nomeingles ==     "Bolivia") | ( nomeingles == "BOLIVIA"))
    { codigo = "BO"}
  if (( nomeingles ==     "Brazil") | ( nomeingles == "BRAZIL"))
    { codigo = "BR"}
  if (( nomeingles ==     "Chile")  | ( nomeingles == "CHILE"))
    { codigo = "CL"}
  if (( nomeingles ==     "Colombia")  | ( nomeingles =="COLOMBIA"))
    { codigo = "CO"}
  if (( nomeingles ==     "Costa Rica")  | (nomeingles == "COSTA RICA"))
    { codigo = "CR"}
  if (( nomeingles ==     "Dominican Republic")  | ( nomeingles == "DOMINICAN REPUBLIC"))
    { codigo = "DR"}
  if (( nomeingles ==     "El Salvador")  | ( nomeingles == "EL SALVADOR"))
    { codigo = "SV"}
  if (( nomeingles ==     "Guatemala")  | ( nomeingles == "GUATEMALA"))
    { codigo = "GT"}
  if (( nomeingles ==     "Honduras")  | ( nomeingles == "HONDURAS"))
    { codigo = "HN"}
  if (( nomeingles ==     "Mexico")  | ( nomeingles == "MEXICO"))
    { codigo = "MX"}
  if (( nomeingles ==     "Nicaragua")  | ( nomeingles == "NICARAGUA"))
    { codigo = "NI"}
  if (( nomeingles ==     "Panama")  | ( nomeingles == "PANAMA"))
    { codigo = "PA"}
  if (( nomeingles ==     "Paraguay")  | ( nomeingles == "PARAGUAY"))
    { codigo = "PY"}
  if ( ( nomeingles ==     "Peru")  | ( nomeingles == "PERU"))
    { codigo = "PE"}
  if (( nomeingles ==     "Uruguay")  | ( nomeingles == "URUGUAY"))
    { codigo = "UY"}
  if (( nomeingles ==     "Venezuela")  | ( nomeingles == "VENEZUELA") | (nomeingles == "Venezuela, RB") | ( nomeingles == "Venezuela, Bolivarian Republic of") )
  { codigo = "VE"}
  return (codigo)
}

#  desdobra listas pais-ano em duas dimensoes no padrão de carga ()

desdobra.lista.pais.ano <- function(parm.lista.pais.ano)
#                              lista.pais.ano é uma variável de entrada com três colunas: país (cod. inernet),
#                              ano (4 digitos) e o valor do dado em questão 
#                              - a saída é uma planilha com o ano (ordenado) na primeira coluna, o país como 
#                                título da linha (na sequência da estrutura-padrão da planilha), e o dado nas colunas
{  
#   cria a saída na formatação padrão bidimensional ano x pais
carga.padrao = read_xls("estrutura padrão.xls")
lista.pais.ano = parm.lista.pais.ano

for (k in 1:nrow(lista.pais.ano))
{
  for (i in 1:nrow(carga.padrao)) 
  { 
    for (j in 2:ncol(carga.padrao))
    {
      if ( 
        (lista.pais.ano [k,1] == names (carga.padrao [j])
         &
         (lista.pais.ano [k,2] ==  carga.padrao [i,1])
        )
      )
      { carga.padrao [i,j] = lista.pais.ano [k,3] } 
    }
  }  
}
return (carga.padrao)
}

#  cria indicador de ordenação por código de país na internet
cria.indicador.ordenacao <- function(parm.cod.pais.internet)
{
  indicador.ordenacao = NA
aux.ordenacao = parm.cod.pais.internet

if ( aux.ordenacao ==     "AR" )
{ indicador.ordenacao = 1}
if ( aux.ordenacao ==     "BO" )
{ indicador.ordenacao = 2}
if ( aux.ordenacao ==     "BR" )
{ indicador.ordenacao = 3}
if ( aux.ordenacao ==     "CL" )
{ indicador.ordenacao = 4}
if ( aux.ordenacao ==     "CO" )
{ indicador.ordenacao = 5}
if ( aux.ordenacao ==     "CR" )
{ indicador.ordenacao = 6}
if ( aux.ordenacao ==     "DR" )
{ indicador.ordenacao = 7}
if ( aux.ordenacao ==     "SV" )
{ indicador.ordenacao = 8}
if ( aux.ordenacao ==     "GT" )
{ indicador.ordenacao = 9}
if ( aux.ordenacao ==     "HN" )
{ indicador.ordenacao = 10}
if ( aux.ordenacao ==     "MX" )
{ indicador.ordenacao = 11}
if ( aux.ordenacao ==     "NI" )
{ indicador.ordenacao = 12}
if ( aux.ordenacao ==     "PA" )
{ indicador.ordenacao = 13}
if ( aux.ordenacao ==     "PY" )
{ indicador.ordenacao = 14}
if ( aux.ordenacao ==     "PE" )
{ indicador.ordenacao = 15}
if ( aux.ordenacao ==     "UY" )
{ indicador.ordenacao = 16}
if ( aux.ordenacao ==     "VE" )
{ indicador.ordenacao = 17}
return (indicador.ordenacao)
}  
  
#  reverte listas pais-ano bidimensionais para listas lineares ordenadas ()

reverte.lista.pais.ano <- function(parm.lista.padrao)
  #                              a saída (lista.pais.ano) é um dataframe com três colunas: país (cod. inernet),
  #                              ano (4 digitos) e o valor do dado em questão 
  #                              - lista-padrao é um dataframe com o ano (ordenado) na primeira coluna, o país como 
  #                                título da linha, e o dado nas colunas
{  
  
#   reverte a saída em  formatação padrão bidimensional ano x pais para uma lista bidimensional

lista.padrao = parm.lista.padrao

lista.pais.ano = data.frame (pais  = c("c1", "c2"), ano = c("y1", "y2"),dado = c (99, 99), 
                             ind.ordenacao = c (99,99) )

cod.pais = colnames(lista.padrao) 

k = 1
  for (i in 1:nrow(lista.padrao)) 
  { 
    for (j in 2:ncol(lista.padrao))
    {
      lista.pais.ano [k,1] = cod.pais [j]
      lista.pais.ano [k,2] = lista.padrao [i,1]
      lista.pais.ano [k,3] = lista.padrao [i,j]
      lista.pais.ano [k,4] = cria.indicador.ordenacao (lista.pais.ano [k,1])
    
      k = k +1
      }  
   }

lista.pais.ano = lista.pais.ano [order (lista.pais.ano$ind.ordenacao, lista.pais.ano$ano),]
lista.pais.ano = lista.pais.ano [c ("pais", "ano", "dado")]
row.names(lista.pais.ano)= NULL
return (lista.pais.ano)
# para testar a função
#estrutura.padrao = read_xls("estrutura padrão.xls")
#teste = reverte.lista.pais.ano (estrutura.padrao)
#write.csv(teste, file = "teste.csv", row.names = FALSE)

}



###################################################################################
########################
###########                   preparação geral dos dados provenientes do V-Dem (todos)
########################
###################################################################################


############################################################################################
# carrega toda a base
############################################################################################

modelo.VDem = readRDS("V-Dem-CY-Full+Others-v12.rds")
# filtra por países
#  aqui não foram retirados GT e NI, porque os dados podem ser
#   necessários para a média latinoamericana
modelo.VDem.por.pais = modelo.VDem [modelo.VDem$country_text_id %in% 
                                      c ("ARG", "BOL", "BRA", "CHL", "COL", "CRI", "DOM", "SLV",
                                         "GTM", "HND", "MEX", "NIC", "PAN", "PRY", "PER", "URY", "VEN"), ]
# filtra por ano
#  inicio e fim deixados com uma folga de um ano, para eventual necessidade de 
#   apurar variações interanuais nos dois extremos do intervalo
data.inicio = 1977
data.fim = 2019

modelo.VDem.por.pais.data = modelo.VDem.por.pais [((modelo.VDem.por.pais$year > (data.inicio - 1)) &
                                                     (modelo.VDem.por.pais$year < (data.fim + 1))), ] 

# insere column id pelo código uniforme de pais com dois digitos
colnames(modelo.VDem.por.pais.data)[colnames(modelo.VDem.por.pais.data) == 'country_id'] = 'cod_pais'

modelo.VDem.por.pais.data$cod_pais = as.character(modelo.VDem.por.pais.data$cod_pais)

for (k in 1:nrow(modelo.VDem.por.pais.data))
{
  if (modelo.VDem.por.pais.data$country_text_id  [k] ==     "ARG" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]  = "AR"}
  
  if (modelo.VDem.por.pais.data$country_text_id  [k] ==     "BOL" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]  = "BO"}
  
  if (modelo.VDem.por.pais.data$country_text_id  [k] ==     "BRA" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]  = "BR"}
  
  if (modelo.VDem.por.pais.data$country_text_id  [k] ==     "CHL" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]  = "CL"}
  
  if (modelo.VDem.por.pais.data$country_text_id  [k] ==     "COL" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]  = "CO"}
  
  if (modelo.VDem.por.pais.data$country_text_id  [k] ==     "CRI" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]  = "CR"}
  
  if (modelo.VDem.por.pais.data$country_text_id  [k] ==     "DOM" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]  = "DR"}
  
  if (modelo.VDem.por.pais.data$country_text_id  [k] ==     "SLV" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]  = "SV"}
  
  if (modelo.VDem.por.pais.data$country_text_id  [k] ==     "GTM" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]  = "GT"}
  
  if (modelo.VDem.por.pais.data$country_text_id  [k] ==     "HND" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]  = "HN"}
  
  if (modelo.VDem.por.pais.data$country_text_id   [k]  ==  "MEX" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]   = "MX"}
  
  if (modelo.VDem.por.pais.data$country_text_id  [k] ==  "NIC" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]  = "NI"}
  
  if (modelo.VDem.por.pais.data$country_text_id  [k] == "PAN" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]  = "PA"}
  
  if (modelo.VDem.por.pais.data$country_text_id  [k] ==   "PRY" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]  = "PY"}
  
  if (modelo.VDem.por.pais.data$country_text_id  [k] == "PER" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]  = "PE"}
  
  if (modelo.VDem.por.pais.data$country_text_id  [k] ==     "URY" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]  = "UY"}
  
  if (modelo.VDem.por.pais.data$country_text_id  [k] ==     "VEN" ) 
  { modelo.VDem.por.pais.data$cod_pais  [k]  = "VE"}
  
}
############################################################################################
# indices de democracia
############################################################################################
# 
#           carrega os dados
carga.democracia.PolityV = read_xls("Polity V.xls", sheet = "carga")
carga.democracia.FreedomHouse = read_xls("Freedom House.xls", sheet = "carga")
#           combina os dois índices
indice.democracia.combinado = carga.democracia.PolityV
for (i in 2:nrow(indice.democracia.combinado))
{
  for (j in 2:ncol(indice.democracia.combinado))
  {
    if ( is.na(carga.democracia.PolityV [i,j]) | is.na(carga.democracia.FreedomHouse[i,j]))
    {indice.democracia.combinado [i,j] = NA}
    else
    {indice.democracia.combinado [i,j] = 1}
  }
}



# para gerar arquivo linear pais.ano em auxilio à montagem da base de gabinetes
#indice.democracia.auxiliar = reverte.lista.pais.ano (indice.democracia.combinado)
#write.table(indice.democracia.auxiliar, file = "democracia.csv", row.names = FALSE)


###################################################################################
########################
###########                   Monta indicador good policy performance
########################
###################################################################################

############################################################################################
# carrega os arquivos de variaveis econômicas
# a planilha lida contém o valor crisp fuzzy da associação entre o  valor da variável no 
# ano-país e a média ajustada da América Latina (os valores "NA" precisam
# ser traduzidos para NA na linguagem de máquina do R)
############################################################################################

# GDP
carga.GDP <- read_xls("GDP v2.0.xls", sheet = "carga")
carga.GDP [carga.GDP == "NA"] <- NA 

# inflação
carga.inflation <- read_xls("Inflation v2.0.xls", sheet = "carga")
carga.inflation [carga.inflation == "NA"] <- NA 

# Desemprego
carga.unemployment <- read_xls("Unemployment v2.0.xls", sheet = "carga")
carga.unemployment [carga.unemployment == "NA"] <- NA 

# Desigualdade
carga.inequality <- read_xls("Inequality from household consumption v2.0.xls", sheet = "carga")
carga.inequality [carga.inequality == "NA"] <- NA 

############################################################################################
# monta o indicador fuzzy combinado, no formato original cross-tab
############################################################################################

# cria o arquivo de saida, zerado com NA
carga.policy.performance <- carga.GDP
carga.policy.performance [ ! is.na(carga.policy.performance) ] <- NA
carga.policy.performance$YR <- carga.GDP$YR


# preenche o arquivo de saida
for ( k in 2:ncol(carga.GDP))
{
  for ( j in 1:nrow(carga.GDP))
  {
    if ( (! is.na (carga.GDP [j,k])) &
         (! is.na (carga.inflation [j,k])) &
         (! is.na (carga.inequality [j,k])) &
         (! is.na (carga.unemployment [j,k])) )
    {
       
       num.var.positivas <- (as.numeric(carga.GDP [j,k]) 
                          + as.numeric(carga.inflation [j,k]) 
                          + as.numeric(carga.inequality [j,k])
                          + as.numeric(carga.unemployment [j,k])
                            )

#    carrega o valor fuzzy do resultado em função do número de
#    variaveis econômicas mehores que a média (fuzzy 1)
      if (num.var.positivas == 4)
         { carga.policy.performance [j,k] <- 1}
      else
      {
        if (num.var.positivas == 3)
        { carga.policy.performance [j,k] <- 0.75}
        else
        {
          if (num.var.positivas == 2)
          { carga.policy.performance [j,k] <- 0.25}
          else
          {
            { carga.policy.performance [j,k] <- 0} 
          }
        }
      }
    }
    
  }  # endfor linhas (ano)
}  # endfor colunas (pais)



############################################################################################
# abre o indicador fuzzy combinado no formato ano-pais das bases de governos minoritários
############################################################################################

add.policy.performance <-  list (CTR = "CT", YR = 1900, ind.performance = 2)
ind.policy.performance <-  list (CTR = "CT", YR = 1900, ind.performance = 2)
ind.policy.performance <- data.frame (ind.policy.performance)
ind.primeiro.registro.gravado <-  0

for ( k in 2:ncol(carga.policy.performance))
{
  for ( j in 1:nrow(carga.policy.performance))
  {
    if (ind.primeiro.registro.gravado  == 0)
    {
      ind.policy.performance$CTR [j] <- colnames(carga.policy.performance [k])
      ind.policy.performance$YR [j] <- carga.policy.performance [j,1]
      ind.policy.performance$ind.performance [j] <- carga.policy.performance [j,k]
    
      ind.primeiro.registro.gravado <- 1
    }
    else
    {
      add.policy.performance$CTR <- colnames(carga.policy.performance [k])
      add.policy.performance$YR  <- carga.policy.performance [j,1]
      add.policy.performance$ind.performance  <- carga.policy.performance [j,k]    
      ind.policy.performance <- rbind (ind.policy.performance, add.policy.performance)
    }
  }
}


############################################################################################
############################################################################################
#################################### MONTA INDICADORES DE CONDIÇÕES CAUSAIS
############################################################################################
############################################################################################

##############################################
#       MONTA INDICADORES PARCIAIS DE GOOD POLICY PERFORMANCE
##############################################